/**
 * 用户控制器
 * 处理用户相关的业务逻辑
 */
const asyncHandler = require('express-async-handler');
const User = require('../models/user');
const Conversation = require('../models/conversation');
const fs = require('fs');
const path = require('path');
const cloudinary = require('../config/cloudinary');

/**
 * 获取用户列表（除了当前用户）
 */
exports.getUsers = async (req, res) => {
  try {
    const currentUserId = req.user.id;
    
    // 查询所有用户，排除当前用户和密码字段
    const users = await User.find({ _id: { $ne: currentUserId } })
      .select('-password')
      .sort({ username: 1 });
    
    res.json(users);
  } catch (error) {
    console.error('获取用户列表错误:', error);
    res.status(500).json({ message: '服务器错误' });
  }
};

/**
 * 获取指定用户信息
 */
exports.getUserById = async (req, res) => {
  try {
    const userId = req.params.id;
    
    // 查询用户信息，排除密码字段
    const user = await User.findById(userId).select('-password');
    
    if (!user) {
      return res.status(404).json({ message: '用户不存在' });
    }
    
    res.json(user);
  } catch (error) {
    console.error('获取用户信息错误:', error);
    
    if (error.kind === 'ObjectId') {
      return res.status(400).json({ message: '无效的用户ID' });
    }
    
    res.status(500).json({ message: '服务器错误' });
  }
};

/**
 * 获取当前用户的联系人列表
 */
exports.getContacts = async (req, res) => {
  try {
    const currentUserId = req.user.id;
    
    // 查询当前用户
    const currentUser = await User.findById(currentUserId)
      .select('contacts')
      .populate('contacts', '-password');
    
    if (!currentUser) {
      return res.status(404).json({ message: '用户不存在' });
    }
    
    res.json(currentUser.contacts);
  } catch (error) {
    console.error('获取联系人列表错误:', error);
    res.status(500).json({ message: '服务器错误' });
  }
};

/**
 * 添加联系人
 */
exports.addContact = async (req, res) => {
  try {
    const currentUserId = req.user.id;
    const { contactId } = req.body;
    
    // 检查contactId是否有效
    if (currentUserId === contactId) {
      return res.status(400).json({ message: '不能添加自己为联系人' });
    }
    
    // 查询要添加的联系人是否存在
    const contactUser = await User.findById(contactId);
    if (!contactUser) {
      return res.status(404).json({ message: '联系人不存在' });
    }
    
    // 查询当前用户
    const currentUser = await User.findById(currentUserId);
    
    // 检查联系人是否已在列表中
    if (currentUser.contacts.includes(contactId)) {
      return res.status(400).json({ message: '联系人已在列表中' });
    }
    
    // 添加联系人到当前用户
    currentUser.contacts.push(contactId);
    await currentUser.save();
    
    // 添加当前用户到联系人的联系人列表（双向）
    contactUser.contacts.push(currentUserId);
    await contactUser.save();
    
    // 创建或查找对话
    let conversation = await Conversation.findOne({
      participants: { $all: [currentUserId, contactId] }
    });
    
    if (!conversation) {
      // 创建新对话
      conversation = new Conversation({
        participants: [currentUserId, contactId]
      });
      await conversation.save();
    }
    
    // 查询更新后的联系人列表
    const updatedUser = await User.findById(currentUserId)
      .select('contacts')
      .populate('contacts', '-password');
    
    res.json(updatedUser.contacts);
  } catch (error) {
    console.error('添加联系人错误:', error);
    
    if (error.kind === 'ObjectId') {
      return res.status(400).json({ message: '无效的联系人ID' });
    }
    
    res.status(500).json({ message: '服务器错误' });
  }
};

/**
 * 获取用户个人资料
 * @route GET /api/users/profile
 * @access Private
 */
const getUserProfile = asyncHandler(async (req, res) => {
  const user = await User.findById(req.user._id);
  
  if (!user) {
    res.status(404);
    throw new Error('用户未找到');
  }
  
  res.json({
    _id: user._id,
    username: user.username,
    email: user.email,
    avatar: user.avatar,
    bio: user.bio,
    isOnline: user.isOnline,
    lastSeen: user.lastSeen,
    createdAt: user.createdAt
  });
});

/**
 * 更新用户个人资料
 * @route PUT /api/users/profile
 * @access Private
 */
const updateUserProfile = asyncHandler(async (req, res) => {
  const user = await User.findById(req.user._id);
  
  if (!user) {
    res.status(404);
    throw new Error('用户未找到');
  }
  
  // 更新允许修改的字段
  const { username, bio } = req.body;
  
  if (username && username !== user.username) {
    // 检查用户名是否已被使用
    const existingUser = await User.findOne({ username });
    if (existingUser) {
      res.status(400);
      throw new Error('该用户名已被使用');
    }
    user.username = username;
  }
  
  if (bio !== undefined) {
    user.bio = bio;
  }
  
  const updatedUser = await user.save();
  
  res.json({
    _id: updatedUser._id,
    username: updatedUser.username,
    email: updatedUser.email,
    avatar: updatedUser.avatar,
    bio: updatedUser.bio,
    isOnline: updatedUser.isOnline,
    lastSeen: updatedUser.lastSeen,
    createdAt: updatedUser.createdAt
  });
});

/**
 * 更新用户头像
 * @route PUT /api/users/avatar
 * @access Private
 */
const updateAvatar = asyncHandler(async (req, res) => {
  // 检查是否上传了文件
  if (!req.file) {
    res.status(400);
    throw new Error('请上传头像图片');
  }
  
  try {
    // 上传图片到Cloudinary
    const result = await cloudinary.uploader.upload(req.file.path, {
      folder: 'chat_app/avatars',
      width: 200,
      height: 200,
      crop: 'fill',
      gravity: 'face'
    });
    
    // 更新用户头像
    const updatedUser = await User.findByIdAndUpdate(
      req.user._id,
      { avatar: result.secure_url },
      { new: true }
    );
    
    res.json({
      _id: updatedUser._id,
      username: updatedUser.username,
      avatar: updatedUser.avatar
    });
  } catch (error) {
    res.status(500);
    throw new Error('头像上传失败: ' + error.message);
  }
});

/**
 * 搜索用户
 * @route GET /api/users/search
 * @access Private
 */
const searchUsers = asyncHandler(async (req, res) => {
  const { keyword } = req.query;
  
  if (!keyword) {
    res.status(400);
    throw new Error('请提供搜索关键词');
  }
  
  // 搜索用户名或邮箱包含关键词的用户，排除自己
  const users = await User.find({
    $and: [
      {
        $or: [
          { username: { $regex: keyword, $options: 'i' } },
          { email: { $regex: keyword, $options: 'i' } }
        ]
      },
      { _id: { $ne: req.user._id } }
    ]
  }).select('username email avatar bio isOnline lastSeen');
  
  res.json(users);
});

module.exports = {
  getUserProfile,
  updateUserProfile,
  updateAvatar,
  searchUsers
}; 